package com.tjetc.controller;

import com.tjetc.entity.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 *
 *  前端传递的数据 该怎么接收
 *
 *
 *
 * @author gaoyongxiang
 * @version v1.0
 * @date 2025/9/4
 */
@Controller
@RequestMapping("/data/")
@SuppressWarnings("all")
public class _2RequestData {

    /*
        get: 放在地址的后面 比如：http://localhost:8080/data/f?username=zhangsan
        post: 放在请求体中
     */

    /*
        Request processing failed:
        java.lang.IllegalArgumentException:
        Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection.
        Ensure that the compiler uses the '-parameters' flag.

        未指定[java.lang.String]类型的参数名称，并且无法通过反射获得参数名称信息。确保编译器使用“-parameters”标志。
        原因：
            在运行时的反射机制中 拿到的参数名是arg0
        解决：
        1. 确保编译器使用“-parameters”标志。是一种解决方式
        2. 通过@RequestParam注解解决
         这个注解可以指明 arg0作为@RequestParam参数中的value值
        3. 推荐使用实体类进行接收 （在真正的工作中 采取的方式）

     */
    @RequestMapping("f")
    public String f(@RequestParam("username") String username){
        System.out.println(username);
        return "ok";
    }

    //spring3.0之前 required 是false 之后是true 防止出现空指针异常
    @RequestMapping("f1")
    public String f1(@RequestParam(value = "username", required = true) String username){
        System.out.println(username.length());
        return "ok";
    }


    @RequestMapping("f2")
    public String f2(@RequestParam(value = "username", required = false, defaultValue = "zhangsan") String username){
        System.out.println(username);
        return "ok";
    }

    // 对象中的属性一定要和前端传递的name一致 否则映射不进来
    // 前端的命名规则是下划线
    @RequestMapping("f3")
    public String f3(User user){
        System.out.println(user.getUsername());
        return "ok";
    }

    // 获取请求头信息
    @RequestMapping("f4")
    public String f4(@RequestHeader("host") String host){
        System.out.println(host);
        return "ok";
    }

    // 使用原生api
    @RequestMapping("f5")
    public String f5(HttpServletRequest request){
        String username = request.getParameter("username");
        System.out.println(username);
        return "ok";
    }

    // 获取session对象
    @RequestMapping("f6")
    public String f6(HttpSession session){
        System.out.println(session);
        return "ok";
    }

    // 级联属性的配置
    @RequestMapping("f7")
    public String f7(User user){
        System.out.println(user.getA().getName());
        return "ok";
    }


}